昨天的文如果注意看,應該會發現有個範例修改了一個內建的變數叫做 LANG
讓 apt-get
變成用英文跑。其實在 Shell 裡面還有非常多這種預設就會存在的環境變數,以下就介紹幾個可能會用到、或是曾經雷過我的環境變數吧。
在 Unix Like 系統中(除了 Mac 以外),可以用 locale
這個指令叫出來,結果大概會長這樣:
其中我們比較會用到的大概是 LANG
這個項目,前面的 zh_TW
是語系沒啥問題,後面的 UTF-8
則表示目前系統要用哪種編碼方式。
debug 程式的時候,因為要開 Server 我習慣用 tmux 把 Server 掛起來,這無論是遠端桌面或是 ssh 進去都可以看到 server 訊息。可是上個月 ssh 進去 Mac 卻發現一個討厭的現象,就是所有的中文都變成 _
了。
正想說「 Mac 在搞什麼」的時候,打了個 locale
指令:我的天啊 Mac 裡的 LANG
預設是空的沒東西,然後 tmux 從 LANG
裡面抓編碼方式,抓不到編碼方式,所以就把所有的中文字替換了。
怎解?用 ssh 進去 Mac 後, export LANG=zh_TW.UTF-8
,再打 tmux a
, It Works!
如果你用 Ubuntu ,可以透過語言中心更改語言;如果你的 Linux 發行版沒有自己的語言管理中心而且採用 systemd
,那麼可以透過 localectl
指令修改它。
剩下的環境變數,幾乎可以用 env
這個指令列表出來,介紹幾個容易用到的環境變數,以及他怎麼影響我們的 Shell 吧。
你可想過為什麼我們打指令的時候,不用打 /usr/bin/python
,可以直接打 python
呢?這就是 PATH
的功能。 PATH
裡面有紀錄很多個資料夾( Windows 用 ;
分隔, Unix Like 用 :
分隔),當你打一個指令時, Shell 會先去 PATH
裡面的資料夾找有沒有這個像是 ls
、 git
或是 adb
之類的檔案,有的話就執行它,沒有記跟你說 command not found
。
我自己寫很多 Script 讓我偷懶,所以我習慣會這樣做: export PATH=$PATH:$HOME/bin
,然後把在家目錄底下建立 bin
資料夾放我的 Script。
紀錄現在這個使用者的家目錄在哪裡,就這樣。
記錄你現在用的是哪個 Shell ,如果你忘了可以來這裡查。
記錄你現在的 Terminal 支援那些樣式,像是 xterm
可以顯示 256 色之類的。
記錄你現在的工作目錄,不過 export PWD=/path
是無法切換路徑的。
記錄你慣用的編輯器,像是 git 在 commit 的時候,跳出來的編輯器就是由他決定(沒有的話, git 會抓 nano 來用)。
如果你透過 ssh 連進主機,還會以以下幾個變數:
SSH_CLIENT
SSH_TTY
SSH_CONNECTION
(不一定會有)以下的參數比較特別,但是總是會用到、或是被雷到。
先說說什麼是 Login Shell ,什麼是 non-Login Shell 吧。簡單講就是「開啟」的方式不一樣,有時候你是打完帳號密碼才進去 Shell ,無論透過 ssh 還是做到電腦前,這種就是 Login Shell;但有時候我們已經在圖形介面登入了,我們沒有打帳號密碼就開啟終端機,這種就是 non-Login Shell 。
你說 su
指令嗎?只打 su
是 Login Shell,打 su -
就是 non-Login Shell,你可以透過 echo $0
看看前面有沒有 -
號得知這是哪一種 Shell 。
這會怎麼影響呢?看到上面很多環境變數想改吧,但是每次關掉要 export
很麻煩。那麼要放在哪裡呢? ~/.profile
還是 ~/.bashrc
或 ~/.zshrc
?
事情是這樣的,如果你是 Login Shell , Shell 會先去讀取 ~/.profile
,再去讀取 ~/.bash_profile
還有 ~/.bashrc
;但如果是 non-Login Shell ,因為已經有環境了,所以系統只會讀取 ~/.bashrc
喔。
所以如果你習慣用圖形介面開終端機,你希望改了馬上有效,那你應該把 export PATH=$PATH:$HOME/bin
放在 ~/.bashrc
或是 ~/.zshrc
,因為放在 ~/.profile
,你得整個圖形介面登出再登入,才能看到效果。
或是你可以偷吃步: source ~/.profile
把 ~/.profile
的變數直接載入到現在的 Shell ,直接 ./.profile
除了可能權限不對, ~/.profile
裡面的變數也不會匯出喔。
還有一個地方有影響, /etc/motd
只會在 Login Shell 顯示, non-Login Shell 並不會顯示,這個在寫 ASCII Art Collection 的時候找超久!!
這個更神奇,有時候 docker run
的時候, apt-get
沒問我要不要裝,有時候又問我要不要裝,然後發現只是差一個 -i
參數,究竟是怎樣?
Docker 這個 -i
參數其實就是告訴 Container 這個 Shell 是不是 Interactive Shell。除了 Docker 以外, Linux 的 corntab
執行指令時,也會是 non-Interactive Shell。
可以透過 echo $-
看裡面有沒有 i
得知這個 Shell 是不是 Interactive Shell。如果你要寫一隻 Script 同時可以要讓 corntab 自動執行,偶爾你也會去手動跑他,那麼這個環境變數就很重要啦。
以上寫介紹了一大堆環境變數,你也知道該怎麼改了,明天來看看環境變數怎麼雷人、以及怎麼找出地雷修復它吧。
我是誰?
我是 dd-han ,可以叫我呆翰,是國立臺中科技大學的延畢生 與 創科資訊的時習生。